Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.05.2014, 17:37
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

Подгрузка данных в новодобавленные html-элементы.
Вообщем, вот такая вот задачка. Есть на сайте поле с select'ом.

<div id="ServiceBlockGroup"> 
                                <div id="CountryServiceOptionsBlock1">
                                    <select name='dynfields[]' class="uk-margin-small-top" id='select_country_id_1' onchange="ajax_update_service(this.value);"><option value=''>страна не выбрана</option></select>
                                    <select name='dynfields[]' class="uk-margin-small-top" id='select_service_id_1'><option value=''>услуга не назначена</option></select><p>
                                </div>
                            </div>


Далее есть набор опций, чтобы можно было добавлять дополнительные селекты, если нужно (Как товар в интернет магазине, например)

<input type="button" id="add_field" value="Добавить услугу">
    <input type="button" id="rem_field" value="Удалить услугу">


Вот код с помощью которого, можно добавлять дополнительные элементы.

var counter = 1;
 
    $("#add_field").click(function () {
 
	if(counter>10){
            alert("Достигнут лимит добавления полей!");
            return false;
	}   
 
	var newTextBoxDiv = $(document.createElement('div'))
	     .attr("id", 'CountryServiceOptionsBlock' + counter);

                newTextBoxDiv.after().html('<select name="dynfields[]' + '" class="uk-margin-small-top" id="select_country_id_' + counter + '" onchange="ajax_update_service(this.value);""><option value="">страна не выбрана</option></select> <select name="dynfields[]' + '" class="uk-margin-small-top" id="select_service_id_' + counter + '""><option value="">услуга не назначена</option></select><p>');
                                                                                                                                  
	newTextBoxDiv.appendTo("#ServiceBlockGroup");
 
	counter++;
        
     });	
    
    $("#rem_field").click(function () {
	if(counter==1){
          alert("Достигнут лимит удаления полей!");
          return false;
       }   
 
	counter--;
 
        $("#CountryServiceOptionsBlock" + counter).remove();
 
     });


Вот код, с помощью которого наполняется select. (В этот select при помощи ajax запроса и php-обработчика подгружаются данные из базы);

function getCountryValue(counter) {
    var country_id = 'select_country_id_';
    return country_id.concat(this.counter.toString()); 
}

function ajax_update_country()  {
    var oXmlHttp = createXMLHttp();
    oXmlHttp.open("post", "../ajax_scripts/countryListUpdate.php", true);
    oXmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    oXmlHttp.send(null);
    oXmlHttp.onreadystatechange = function()  {
        if(oXmlHttp.readyState == 4) 
        {
            if(oXmlHttp.status == 200) 
            {
                a = oXmlHttp.responseText;
                document.getElementById(getCountryValue()).innerHTML = a;
            } 
                else {displayCustomerInfo("Ошибка: " + oXmlHttp.statusText);}
        }
    };
}


Ну и собственно вот php обработчик, подгружающий данные в select, но я думаю он тут не нужен. Просто для наглядности.

<?php
include('mysql.php');

$sql_get_countries = mysql_query("SELECT * FROM system_countries");

while($row_country = mysql_fetch_array($sql_get_countries)) {
        echo "<option value='".$row_country['country_id']."'>".$row_country['country_name']."</option>";
    }
?>


Вопрос заключается в следующем, данный код полностью работоспособен, но ТОЛЬКО для первого селекта. Стоит добавить ещё элементов, и они уже не работают. Хотя в ajax функцию передаются id разными значениями counter.

Как заставить ajax срабатывать при добавлении n-элементов?

Заранее благодарен за помощь.

p.s.

Задавайте любые вопросы, если задача не ясна.

Последний раз редактировалось broadcast77, 06.05.2014 в 19:08.
Ответить с цитированием
  #2 (permalink)  
Старый 06.05.2014, 18:29
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

Исправил в ajax-скрипте небольшие недочёты. Но всё равно жду помощи по основному вопросу.
Ответить с цитированием
  #3 (permalink)  
Старый 06.05.2014, 19:09
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

UPD.

Переделал код для добавления полей, добавил опцию удаления полей.
Но всё ещё жду от вас помощи. Да первый раз всё работает, но стоит добавить ещё полей, перестаёт работать и первый select (

ребят, в чём дело! Помогите! =(
Ответить с цитированием
  #4 (permalink)  
Старый 07.05.2014, 05:10
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Хоть бы макет какой простенький с демонстрацией проблемы сделали бы... Мне лично совершенно не хочет вручную собирать пазл из разрозненных кусочков кода. И почему не используете jQuery для аякса?
Ответить с цитированием
  #5 (permalink)  
Старый 07.05.2014, 15:51
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

Сообщение от jsnb Посмотреть сообщение
Хоть бы макет какой простенький с демонстрацией проблемы сделали бы... Мне лично совершенно не хочет вручную собирать пазл из разрозненных кусочков кода. И почему не используете jQuery для аякса?
Окей, что вы предлагаете? На отдельный хостинг вам выложить?
Ответить с цитированием
  #6 (permalink)  
Старый 08.05.2014, 07:52
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от broadcast77 Посмотреть сообщение
Окей, что вы предлагаете? На отдельный хостинг вам выложить?
Я предлагаю сделать примитивный макет, в котором останется только часть демонстрирующая проблему. Серверная часть может состоять вообще из одной строки вида: echo "данные_в_нужном_формате". Потому что без демонстрации я так и не понял на что там у вас повешан аякс и при добавлении чего оно не работает. В приведенных кусках кода вообще какая-то неразбериха - в HTML указана одна функция, в JS приведена другая и совершенно непонятно как оно всё вместе там у вас работает. И для создания макета не нужен хостинг, достаточно HTML+JS+формат данных, которые возвращает сервер.
Ответить с цитированием
  #7 (permalink)  
Старый 08.05.2014, 14:47
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

Сообщение от jsnb Посмотреть сообщение
Я предлагаю сделать примитивный макет, в котором останется только часть демонстрирующая проблему. Серверная часть может состоять вообще из одной строки вида: echo "данные_в_нужном_формате". Потому что без демонстрации я так и не понял на что там у вас повешан аякс и при добавлении чего оно не работает. В приведенных кусках кода вообще какая-то неразбериха - в HTML указана одна функция, в JS приведена другая и совершенно непонятно как оно всё вместе там у вас работает. И для создания макета не нужен хостинг, достаточно HTML+JS+формат данных, которые возвращает сервер.


Так, короче я решил облегчить задачу максимально. И воспользоваться jQuery + AJAX.

Вот смотрите.

Сначала html

<select id='select_country_id'><option value=''>страна не выбрана</option></select>
<input type="button" id="add_field" value="Добавить услугу">


Далее jQuery - получаем данные из php скрипта.

$(document).ready(function() {            
            $.ajax({ 
                type: "POST",
                url: "countryListUpdate.php",             
                dataType: "html", 
                success: function(response){ 
                    //alert(response); 
                    $('#select_country_id').html(response);
                }
            });
        });


Ну и собственно код, позволяющий добавлять селекты:

var counter = 1;
 
    $("#add_field").click(function () {
 
	if(counter>10){
            alert("Достигнут лимит добавления полей!");
            return false;
	}   
 
	var newTextBoxDiv = $(document.createElement('div'))
	     .attr("id", 'CountryServiceOptionsBlock' + counter);

                newTextBoxDiv.after().html('<select id="select_country_id' + counter + '"><option value="">страна не выбрана</option></select><p>');
                                                                                                                                  
	newTextBoxDiv.appendTo("#ServiceBlockGroup");
 
	counter++;
        
     });


Вопрос - как сделать, так, чтобы страны могли подгружаться в n-ый добавленый элемент select?
Пока подгружаются только в первый.
Ответить с цитированием
  #8 (permalink)  
Старый 08.05.2014, 15:04
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Так подгружаться они должны когда? При создании нового селекта? Ну так в чем тогда проблема выполнить после создания селекта тот же самый ajax запрос что используется для первого, но с другим id элемента куда надо вставлять данные?
Например, сделать функцию вида:
function updateSelect(selectId) {
  $.ajax({ 
                type: "POST",
                url: "countryListUpdate.php",             
                dataType: "html", 
                success: function(response){ 
                    //alert(response); 
                    $('#'+selectId).html(response);
                }
            });
}

И вызывать ее после создания селекта:
var counter = 1;
 
    $("#add_field").click(function () {
 
	if(counter>10){
            alert("Достигнут лимит добавления полей!");
            return false;
	}   
 
	var newTextBoxDiv = $(document.createElement('div'))
	     .attr("id", 'CountryServiceOptionsBlock' + counter);

                newTextBoxDiv.after().html('<select id="select_country_id' + counter + '"><option value="">страна не выбрана</option></select><p>');
                                                                                                                                  
	newTextBoxDiv.appendTo("#ServiceBlockGroup");

	updateSelect("select_country_id' + counter);

	counter++;
        
     });

Ну и если данные одни те же во все селектах, то не проще подставлять их из первого селекта?
Ответить с цитированием
  #9 (permalink)  
Старый 08.05.2014, 15:10
Аспирант
Отправить личное сообщение для broadcast77 Посмотреть профиль Найти все сообщения от broadcast77
 
Регистрация: 25.12.2013
Сообщений: 31

Я просто не знаю сколько у меня будет ещё таких селектов.
У меня будут на форме элементы select с id select_country_id_n. У них же ID меняется
Поэтому и спрашиваю, как заставить работать ajax функцию для новоиспеченых элементов.

Последний раз редактировалось broadcast77, 08.05.2014 в 15:13.
Ответить с цитированием
  #10 (permalink)  
Старый 08.05.2014, 17:25
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от broadcast77 Посмотреть сообщение
Я просто не знаю сколько у меня будет ещё таких селектов.
У меня будут на форме элементы select с id select_country_id_n. У них же ID меняется
Поэтому и спрашиваю, как заставить работать ajax функцию для новоиспеченых элементов.
А я еще раз спрашиваю что мешает при добавлении новых селектов выполнять для них тот же самый аякс что и для первого, но меняя id селекта, в который будут добавляться пришедшие с сервера данные? В общем, чем не устраивает тот вариант, который я привел выше? Или аякс запрос должен выполнятся не при добавлении селекта? Тогда уточняйте когда он должен срабатывать.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранение данных html, сконфигурированных JS. wayzer Общие вопросы Javascript 1 28.08.2012 20:38
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Как удалить из HTML все элементы со стилем hidden Почемучкин Events/DOM/Window 3 24.06.2011 14:40
Динамические html элементы sky Элементы интерфейса 2 07.03.2010 11:58
передача данных из xml в html yupa AJAX и COMET 40 30.07.2009 10:11